package debby.bdmap.utils

import com.baidu.location.BDAbstractLocationListener
import com.baidu.location.BDLocation
import com.baidu.location.LocationClient
import com.baidu.location.LocationClientOption
import com.baidu.mapapi.map.*
import com.baidu.mapapi.model.LatLng
import debby.bdmap.interfaceutil.MainUtils

/**
 * Created by debby on 2018/6/11.
 * 描述:百度初始化
 */
//定位
fun initLocation(client: LocationClient, baidu: BaiduMap) {
    val option = LocationClientOption()
    option.locationMode = LocationClientOption.LocationMode.Hight_Accuracy
    //可选，设置定位模式，默认高精度
    //LocationMode.Hight_Accuracy：高精度；
    //LocationMode.Battery_Saving：低功耗；
    //LocationMode.Device_Sensors：仅使用设备；
    option.setCoorType("bd09ll")
    //可选，设置返回经纬度坐标类型，默认gcj02
    //gcj02：国测局坐标；
    //bd09ll：百度经纬度坐标；
    //bd09：百度墨卡托坐标；
    //海外地区定位，无需设置坐标类型，统一返回wgs84类型坐标

    option.setScanSpan(1000)
    //可选，设置发起定位请求的间隔，int类型，单位ms
    //如果设置为0，则代表单次定位，即仅定位一次，默认为0
    //如果设置非0，需设置1000ms以上才有效

    option.isOpenGps = true
    //可选，设置是否使用gps，默认false
    //使用高精度和仅用设备两种定位模式的，参数必须设置为true

    option.isLocationNotify = true
    //可选，设置是否当GPS有效时按照1S/1次频率输出GPS结果，默认false

    option.setIgnoreKillProcess(false)
    //可选，定位SDK内部是一个service，并放到了独立进程。
    //设置是否在stop的时候杀死这个进程，默认（建议）不杀死，即setIgnoreKillProcess(true)

    option.SetIgnoreCacheException(false)
    //可选，设置是否收集Crash信息，默认收集，即参数为false

    option.setWifiCacheTimeOut(5 * 60 * 1000)
    //可选，7.2版本新增能力
    //如果设置了该接口，首次启动定位时，会先判断当前WiFi是否超出有效期，若超出有效期，会先重新扫描WiFi，然后定位

    option.setEnableSimulateGps(false)
    //可选，设置是否需要过滤GPS仿真结果，默认需要，即参数为false

    client.locOption = option
    //client为第二步初始化过的LocationClient对象
    //需将配置好的LocationClientOption对象，通过setLocOption方法传递给LocationClient对象使用
    client.registerLocationListener(object : BDAbstractLocationListener() {
        override fun onReceiveLocation(location: BDLocation?) {
            //此处的BDLocation为定位结果信息类，通过它的各种get方法可获取定位相关的全部结果
            //以下只列举部分获取经纬度相关（常用）的结果信息
            //更多结果信息获取说明，请参照类参考中BDLocation类中的说明
            val latitude = location!!.latitude    //获取纬度信息
            val longitude = location.longitude    //获取经度信息
            val radius = location.radius    //获取定位精度，默认值为0.0f
            //val coorType = location.coorType
            //获取经纬度坐标类型，以LocationClientOption中设置过的坐标类型为准
            //val errorCode = location.locType
            //获取定位类型、定位错误返回码，具体信息可参照类参考中BDLocation类中的说明
            baidu.isMyLocationEnabled = true
            val localData = MyLocationData.Builder()
                    .accuracy(radius)
                    .direction(100f)
                    .latitude(latitude)
                    .longitude(longitude)
                    .build()
            baidu.setMyLocationData(localData)
            baidu.animateMapStatus(MapStatusUpdateFactory
                    .newMapStatus(MapStatus.Builder()
                            .target(LatLng(latitude, longitude))
                            .zoom(18f)
                            .build()))
            client.stop()
        }
    })
    client.start()
}

//UI
fun initBDUi(ui: UiSettings) {
    //地图俯视（3D）
    ui.isOverlookingGesturesEnabled = false
}

val pointList = ArrayList<LatLng>()

fun initMap(map: BaiduMap, mainUtils: MainUtils) {
    map.setOnMapClickListener(object : BaiduMap.OnMapClickListener {
        override fun onMapClick(point: LatLng?) {
            pointList.add(point!!)
            if (pointList.size == 1) {
                drawMarks(map, point)
            } else {
                drawLine(map, pointList)
            }
//            if (pointList.size > 2) {
//                removeOverlay(OneLine)
//                drawArea(map, pointList)
//            }
            measureDistance(mainUtils)
//            measureArea(mainUtils)
            mainUtils.toast("经度：${String.format("%.6f", point.longitude)}," +
                    "纬度：${String.format("%.6f", point.latitude)}")
        }

        override fun onMapPoiClick(poi: MapPoi?): Boolean {
            return false
        }
    })
}

/**
 * 测量总长度
 */
fun measureDistance(mainUtils: MainUtils) {
    var distance = 0.0
    for (i in 1 until pointList.size) {
        distance += getDistance(pointList[i], pointList[i - 1])
    }
    if (distance == 0.0) {
        mainUtils.setDistance("")
    } else {
        mainUtils.setDistance("${String.format("%.2f", distance)} 米")
    }
}

/**
 * 测量总长度
 */
fun measureArea(mainUtils: MainUtils) {
    if (pointList.size < 3) return
    val area = getArea(pointList)
    mainUtils.setDistance("$area 平方米")
}

